/**
 * 该文件不关心业务逻辑
 * 专门用来数据操作文件模块
 * 职责：操作文件中的数据，只处理数据，不关心业务
 * 这里才是node 的精华部分，异步编程，封装异步API
*/

let fs = require('fs');
let dbPath = './db.json';
/**
 * 获取所有学生列表
 * return []
 */
exports.find = function (callback) {
  // callback中的参数，
  // 第一个是err： 成功null， 错误就是错误对象
  // 第二个参数是结果： 成功是获取的内容， 错误是undefined
  fs.readFile(dbPath,'utf8', function (err, data) {
    if (err) {
      return callback(err);
    }
    callback(null, JSON.parse(data).students);
  });
};

/**
 * 根据id获取学生信息
 */
exports.findById = function (id, callback) {
  fs.readFile(dbPath,'utf8', function (err, data) {
    if (err) {
      return callback(err);
    }
    let students = JSON.parse(data).students;
    let ret = students.find(function (item) {
      return item.id === id;
    });
    callback(null, ret);
    students = null;
    ret = null;
  });
};


/**
 * 添加保存学生
 */
exports.save = function (student, callback) {
  fs.readFile(dbPath, 'utf8', function (err, data) {
    if (err) {
      return callback(err);
    }
    let students = JSON.parse(data).students;
    // 处理id 唯一的不重复
    student.id = students[students.length - 1].id + 1;
    // 把用户传递的对象保存到数组中
    students.push(student);
    // 把对象数据转换为字符串
    let ret = JSON.stringify({students: students});
    fs.writeFile(dbPath, ret, function (err) {
      if (err) {
        // 错误就把错误对象传递给callback
        return callback(err);
      }
      // 成功就没错误，所以错误对象就是null
      callback(null);
    });
    ret = null;
    students = null;
  })
};

/**
 * 更新学生
 */
exports.updateById = function (student, callback) {
  // 读取文件内容
  fs.readFile(dbPath, 'utf8', function (err, data) {
    if (err) {
      return callback(err);
    }
    let students = JSON.parse(data).students;

    student.id = parseInt(student.id); // 把id转为数字，避免存储的时候id变为字符串

    // 要修改谁，就把谁找出来
    // find是ES6中的新方法，接受一个函数作为参数
    // 遍历并且比较，返回结果为true的一项
    let stu = students.find(function (item) {
      return item.id === student.id; // 这里返回了student.id这一项
    });
    // 循环一遍要改的这一项，让它每一项等于新的一项
    // 是灵活的，对应的项对应修改的项
    // 遍历拷贝修改对象
    for (let key in student) {
      stu[key] = student[key];
    }
    // 对象转为字符串
    let ret = JSON.stringify({students: students});
    fs.writeFile(dbPath, ret, function (err) {
      if (err) {
        // 错误就把错误对象传递给callback
        return callback(err);
      }
      // 成功就没错误，所以错误对象就是null
      callback(null);
    });
    stu = null;
    ret = null;
  })
};

/**
 * 删除学生
 */
exports.delete = function (id, callback) {
  fs.readFile(dbPath,'utf8', function (err, data) {
    if (err) {
      return callback(err);
    }
    let students = JSON.parse(data).students;
    // findIndex 用来寻找元素下标
    let deleteId = students.findIndex(function (item) {
      return item.id === parseInt(id);
    });
    students.splice(deleteId, 1);
    students = JSON.stringify({
      students: students
    });
    fs.writeFile(dbPath, students, function (err) {
      if (err) {
        // 错误就把错误对象传递给callback
        return callback(err);
      }
      // 成功就没错误，所以错误对象就是null
      callback(null);
    });
    students = null;
    deleteId = null;
  });
};


